package com.edais.interceptor;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import com.edais.service.SecurityService;
import com.edais.util.CommonUtil;
import com.edais.util.Consts;
import com.edais.util.Message;

public class SessionInterceptor implements HandlerInterceptor {
	/** 日志 **/
	private static final Logger logger = Logger.getLogger(SessionInterceptor.class);
	
	@Autowired
	private SecurityService securityService;

	/**
	 * 在DispatcherServlet完全处理完请求后被调用
	 * 
	 * 当有拦截器抛出异常时,会从当前拦截器往回执行所有的拦截器的afterCompletion()
	 */
	@Override
	public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception{

	}

	/**
	 * 在业务处理器处理请求执行完成后,生成视图之前执行的动作
	 */
	@Override
	public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception{
		
	}

//	/**
//	 * 在业务处理器处理请求之前被调用 如果返回false 从当前的拦截器往回执行所有拦截器的afterCompletion(),再退出拦截器链
//	 * 如果返回true 执行下一个拦截器,直到所有的拦截器都执行完毕 再执行被拦截的Controller 然后进入拦截器链,
//	 * 从最后一个拦截器往回执行所有的postHandle() 接着再从最后一个拦截器往回执行所有的afterCompletion()
//	 */
//	@Override
//	public boolean preHandle(HttpServletRequest request, HttpServletResponse res, Object handler) {
//		
//		logger.debug("开始进行session拦截器");
//		
//		String paramters = null;
//		try {
//			 
//			//获取get参数
//			String reqString = request.getQueryString();
//			
//			if (reqString == null) {
//				//获取post参数
//				InputStream is = request.getInputStream();
//				InputStreamReader isr = new InputStreamReader(is);   
//				BufferedReader br = new BufferedReader(isr);
//				reqString = br.readLine();
//			}
//			
//			if (StringUtils.isNotBlank(reqString)) {
//				// 解码POST提交的参数
//				reqString = java.net.URLDecoder.decode(reqString,"UTF-8");
//				
//				// 解密  Base64 + 3DES
//				paramters = DES3Util.decode(reqString);
//				
//				logger.debug("请求参数列表：");
//				String[] tmpArr = paramters.split("&");
//				for(int i = 0; i < tmpArr.length; i++){
//					logger.debug("*************" + tmpArr[i]);
//					
//					String[] paramArr = tmpArr[i].split("=");
//					
//					if (paramArr.length == 1) {        // 参数值为空
//						request.setAttribute(paramArr[0], "");
//					} else if (paramArr.length == 2) {
//						request.setAttribute(paramArr[0], paramArr[1]);
//					} else {
//						
//					}
//				}
//			}
//			
//			return true;
//		} catch (Exception e) {
//			logger.debug("请求参数解析异常：" + e.getMessage());
//			String result = CommonUtil.setResultInfo(new HashMap<String, Object>(),
//														Consts.ERROR_CODE, Consts.ErrorMsg.MSG00001);
//			CommonUtil.responseJson(result, res);
//			return false;
//		}
//	}
	
	/**
	 * 在业务处理器处理请求之前被调用 如果返回false 从当前的拦截器往回执行所有拦截器的afterCompletion(),再退出拦截器链
	 * 如果返回true 执行下一个拦截器,直到所有的拦截器都执行完毕 再执行被拦截的Controller 然后进入拦截器链,
	 * 从最后一个拦截器往回执行所有的postHandle() 接着再从最后一个拦截器往回执行所有的afterCompletion()
	 */
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse res, Object handler) {
		/**
		 * 该拦截器主要实现的功能是单点登陆和修改密码的异步提示，防止重复登录
		 */
		logger.debug("开始进行【单点登陆和修改密码的异步提示】功能的拦截");
		try{
			// 解密请求参数
			String url = request.getRequestURI();
			
			logger.debug("请求url："+ url);
			// 由于getAppVersionInfo接口没有加密，而且无userId，所以直接排除了该接口的拦截
			if(url.contains("/options/getAppVersionInfo")){
				logger.debug("结束【单点登陆和修改密码的异步提示】功能的拦截");
				return true;
			}
			Map<String, String> paramsMap = CommonUtil.decryptParamters(request);
			
			String userId = paramsMap.get("userId");   //用户id
			String uuid = paramsMap.get("uuid");   //登录识别码
			
			if(StringUtils.isNotBlank(userId) && StringUtils.isNotBlank(uuid)){
				/**
				 * 根据用户id查询该用户的登录识别码是否一致
				 * 有值且一致的情况下直接返回true
				 * 有值且不一致的情况下说明该账户已在他处登录,返回false
				 * 没值的情况下直接返回true
				 */
			
				String token = securityService.getLoginTokenStr(paramsMap);
				if(StringUtils.isNotBlank(token) && !uuid.equals(token)){
					// 判断提示类型（修改密码或者别处登录）
					if(token.contains("setPwd")){
						logger.debug("结束【单点登陆和修改密码的异步提示】功能的拦截---设置密码");
						String result = CommonUtil.setResultStringCn(new HashMap<String, Object>(),
								Consts.SECURITY_CODE, "",Message.CnDescriptionExpression.LOGIN_DANGEROUS2);
							CommonUtil.responseJson(result, res);
							return false;
					}else if(token.contains("register") || token.contains("login")){
						logger.debug("结束【单点登陆和修改密码的异步提示】功能的拦截---别处登录");
						String result = CommonUtil.setResultStringCn(new HashMap<String, Object>(),
								Consts.SECURITY_CODE, "",Message.CnDescriptionExpression.LOGIN_DANGEROUS1);
							CommonUtil.responseJson(result, res);
							return false;
					}
				}
			}
			
			logger.debug("结束【单点登陆和修改密码的异步提示】功能的拦截");
			return true;
		}catch (Exception e) {
			logger.debug("【单点登陆和修改密码的异步提示】功能的拦截异常：" + e.getMessage());
			String result = CommonUtil.setResultStringCn(new HashMap<String, Object>(),
				Consts.ERROR_CODE, Consts.ErrorMsg.MSG00001,Message.CnDescriptionExpression.BUSINESSE_ERROR);
			CommonUtil.responseJson(result, res);
			return false;
		}
	}
}
